# coding: utf-8

# 变量存储的是对象的引用，变量赋值是按值传递（引用本身）。
x = "段光伟"
y = x
puts x.object_id
puts y.object_id

# 类型判断。
o = 1
puts o.class
puts o.class.superclass
puts o.instance_of? Fixnum
puts o.instance_of? Object
puts o.is_a? Object
puts o.kind_of? Object

# === 内部调用了is_a?
puts Object === 1 # true
puts 1 === Object # false

# 比较两个变量是否引用同一个实例。
x = 1
y = x
puts x.equal? y
puts x.object_id == y.object_id

# 比较两个对象的内容是否相等。
x = "段光伟"
y = "段光伟"
puts x.equal? y
puts x == y

# eql?不进行类型转换。
puts 1 == 1.0
puts 1.eql? 1.0

# ===Case运算符。
puts (1..5) === 5
puts /\d+/ === "123"
puts String === "hi"

# 正则表达式匹配。
puts /\d+/ =~ "d123"
puts /\d+/ !~ "dddd"

# 排序运算符：<=>
puts 1 <=> 2
puts 1 <=> 1
puts 2 <=> 1

# 显式类型转换。
puts 1.to_s
puts "1".to_i
puts 1.to_f
puts (1..1).to_a

# 对象拷贝，clone和dup都是浅拷贝，clone会拷贝单利方法。
puts [1].clone
puts [1].dup

# 序列化对象
require "yaml"
puts YAML.dump([1, 2, 3])

# 冻结对象。
a = [1]
a.freeze
puts a.frozen?
begin
	a[0] = 1
rescue
	puts "冻结后不能修改"
end